public class SingleNumberⅢ {
    public int[] singleNumber(int[] nums) {
        int ret = 0;
        for(int x : nums) {
            // 得出最后两个元素的异或结果
            ret ^= x;
        }

        // 取到最右侧 1 作为标志位 (防止溢出)
        int flag = (ret == Integer.MIN_VALUE ? ret : ret & (-ret));
        int[] answer = new int[2];
        for(int x : nums) {
            if((x & flag) == 0) {
                // 该标志位为 0 的元素作为一组, 进行异或操作, 最后剩下的就是在该组中只出现一次的数字
                answer[0] ^= x;
            }else {
                // 该标志位为 1 的元素作为一组, 进行异或操作, 最后剩下的就是在该组中只出现一次的数字
                answer[1] ^= x;
            }
        }
        return answer;
    }
}
